﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Npgsql;
using SIGEB.Modelo.moduloEjemplar;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Modelo.moduloEditorial;
using SIGEB.Modelo.moduloGrupo;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo.moduloPrestamos;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloComputadoras;
using bibliotecaObservador;
using SIGEB.Modelo.moduloTipoDocumentos;
using SIGEB.Modelo.moduloMultas;

namespace SIGEB.Modelo
{
    public class datosAplicacion
    {
        #region "constructores"

        public datosAplicacion(string Host, string Port, string User, string Pass, string DataBaseName)
        {
            this.Host = Host;
            this.Port = Port;
            this.User = User;
            this.Pass = Pass;
            this.DataBaseName = DataBaseName;
            conexion = new NpgsqlConnection(conexionString());
            conexionPrueba();
            iniciarConjuntos();
        }

        #endregion

        #region "métodos"

        private void conexionPrueba()
        {
            conexion.Open();
            conexion.Close();
        }

        private void iniciarConjuntos()
        {
            this.editoriales = new conjuntoEditoriales(this);
            this.autores = new conjuntoAutores(this);
            this.documentos = new conjuntoDocumentos(this);
            this.ejemplares = new conjuntoEjemplares(this);
            this.grupos = new conjuntoGrupos(this);
            this.tipoPerfiles = new conjuntosTipoPerfil(this);
            this.prestamos = new conjuntoPrestamos(this);
            this.tiposUsuario = new conjuntoTipoUsuarios(this);
            this.usuarios = new conjuntoUsuarios(this);
            this.estadisticas = new conjuntoEstadisticas(this);
            this.tiposDocumentos = new conjuntoTipoDocumentos(this);
            this.atributos = new conjuntoAtributos(this);
            this.infocomputadoras = new conjuntoInfoComputadoras(this);
            this.valores = new conjuntoValores(this);
            this.reservas = new conjuntoReservas(this);
            this.multas = new conjuntoMultas(this);
        }

        private string conexionString()
        {
            return String.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};",
                Host, Port, User, Pass, DataBaseName);
        }

        public void registrarObservador(IObservador nuevoObservador)
        {
            autores.agregarObservador(nuevoObservador);
            documentos.agregarObservador(nuevoObservador);
            ejemplares.agregarObservador(nuevoObservador);
            editoriales.agregarObservador(nuevoObservador);
            grupos.agregarObservador(nuevoObservador);
            tipoPerfiles.agregarObservador(nuevoObservador);
            prestamos.agregarObservador(nuevoObservador);
            tiposUsuario.agregarObservador(nuevoObservador);
            usuarios.agregarObservador(nuevoObservador);
            estadisticas.agregarObservador(nuevoObservador);
            tiposDocumentos.agregarObservador(nuevoObservador);
            atributos.agregarObservador(nuevoObservador);
            infocomputadoras.agregarObservador(nuevoObservador);
            valores.agregarObservador(nuevoObservador);
            reservas.agregarObservador(nuevoObservador);
            multas.agregarObservador(nuevoObservador);
        }

        #endregion

        #region "atributos"

        public conjuntoAutores autores;
        public conjuntoDocumentos documentos;
        public conjuntoEjemplares ejemplares;
        public conjuntoEditoriales editoriales;
        public conjuntoGrupos grupos;
        public conjuntosTipoPerfil tipoPerfiles;
        public conjuntoPrestamos prestamos;
        public conjuntoTipoUsuarios tiposUsuario;
        public conjuntoUsuarios usuarios;
        public conjuntoEstadisticas estadisticas;
        public conjuntoTipoDocumentos tiposDocumentos;
        public conjuntoAtributos atributos;
        public conjuntoInfoComputadoras infocomputadoras;
        public conjuntoValores valores;
        public conjuntoReservas reservas;
        public conjuntoMultas multas;

        internal NpgsqlConnection conexion;

        string Host;
        string Port;
        string User;
        string Pass;
        string DataBaseName;

        #endregion
    }
}
